package com.microtf.inscription.framework.autoconfigure;

import com.microtf.inscription.framework.controller.MetaWebLogController;
import com.microtf.inscription.framework.service.BlogMetaWebLogListener;
import com.microtf.inscription.metaweblog.MetaWebLogListener;
import com.microtf.inscription.metaweblog.MetaWebLogService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;

/**
 * MetaWebLog自动注入服务
 * <p>使用inscription.weblog.enable开启服务</p>
 *
 * @author guliuzhong
 * @version 1.0
 * @since 1.0
 */
@ConditionalOnClass({MetaWebLogService.class})
@EnableConfigurationProperties(MetaWebLogProperties.class)
@Slf4j
public class MetaWebLogAutoConfiguration {
    final String DEFAULT_RPC="/xmlrpc";

    private RequestMappingHandlerMapping requestMappingHandlerMapping;

    @Autowired
    public void setRequestMappingHandlerMapping(RequestMappingHandlerMapping requestMappingHandlerMapping) {
        this.requestMappingHandlerMapping = requestMappingHandlerMapping;
    }

    /**
     * 动态注册MetaWebLogService 服务
     * <p>MetaWebLogListener可以使用项目中的默认实现{@link BlogMetaWebLogListener}</p>
     * @param metaWebLogProperties MetaWeblog配置
     * @param metaWebLogListener metaWebLogListener的实现
     * @return MetaWebLogService
     * @author guliuzhong
     * @since 1.0
     */
    @Bean
    @Autowired
    MetaWebLogService metaWebLogService( MetaWebLogProperties metaWebLogProperties, MetaWebLogListener metaWebLogListener) {
        MetaWebLogService metaWebLogService = new MetaWebLogService();
        if (metaWebLogProperties.getEnable()) {
            if (metaWebLogProperties.getUrl() == null || metaWebLogProperties.getUrl().equals("")) {
                metaWebLogService.setRpcUrl(DEFAULT_RPC);
            } else {
                metaWebLogService.setRpcUrl(metaWebLogProperties.url);
            }
            if (metaWebLogProperties.getHost() != null && !metaWebLogProperties.getHost().equals("")) {
                metaWebLogService.setRpcHost(metaWebLogProperties.getHost());
            }
            metaWebLogService.setMetaWebLogListener(metaWebLogListener);
        }
        return metaWebLogService;
    }
    @Bean
    BlogMetaWebLogListener blogMetaWebLogListener(){
        return new BlogMetaWebLogListener();
    }

    /**
     * 动态注册Xml Rpc 服务
     *
     * @param metaWebLogProperties MetaWeblog配置
     * @return MetaWebLogController
     * @author guliuzhong
     * @since 1.0
     */
    @Bean
    @ConditionalOnProperty(prefix = "inscription.weblog", name = "enable", havingValue = "true")
    MetaWebLogController metaWebLogController(@Autowired MetaWebLogProperties metaWebLogProperties) {
        MetaWebLogController metaWebLogController = new MetaWebLogController();
        try {
            StringBuilder xmlRpc = new StringBuilder();
            if (metaWebLogProperties.getUrl() == null || metaWebLogProperties.getUrl().equals("")) {
                xmlRpc.append(DEFAULT_RPC);
            } else {
                xmlRpc.append(metaWebLogProperties.url);
            }
            RequestMappingInfo.Builder produces = RequestMappingInfo.paths(xmlRpc.toString()).produces("application/xml;charset=utf-8");
            Method xmlRpcServer = metaWebLogController.getClass().getDeclaredMethod("xmlRpcServer");
            requestMappingHandlerMapping.registerMapping(produces.methods(RequestMethod.GET).build(), metaWebLogController, xmlRpcServer);
            Method xmlRpcServerPost = metaWebLogController.getClass().getDeclaredMethod("xmlRpcServer", HttpServletRequest.class, HttpServletResponse.class);
            requestMappingHandlerMapping.registerMapping(produces.methods(RequestMethod.POST).build(), metaWebLogController, xmlRpcServerPost);
        } catch (NoSuchMethodException e) {
            log.error("注册MetaWebLog Controller失败{}", e.getMessage());
        }
        return metaWebLogController;
    }

}
